<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>10_生成器(Generator)-生成器函数返回值</title>
  <!-- 
  在 JavaScript 中，生成器函数的返回值具有特定的结构和含义。
  1. 生成器的返回值

  生成器函数在执行完成后，可以通过  `return`  语句返回一个值。这个返回值会被封装在生成器对象的  `next()`  方法的返回结果中。

  2. 返回值的结构

  当生成器函数执行完成并返回时，调用  `next()`  方法会返回一个对象，该对象包含两个属性：
  -  `value` : 生成器函数通过  `return`  返回的值。
  -  `done` : 一个布尔值，指示生成器是否已完成（ `done`  为  `true`  表示已完成）。

  3. 示例代码

  以下是一个生成器函数的示例，展示了如何使用  `return`  返回值：
  function* myGenerator() {
      yield 1;
      yield 2;
      return 3; // 返回值
  }

  const gen = myGenerator();

  console.log(gen.next()); // 输出: { value: 1, done: false }
  console.log(gen.next()); // 输出: { value: 2, done: false }
  console.log(gen.next()); // 输出: { value: 3, done: true }
  console.log(gen.next()); // 输出: { value: undefined, done: true }
  4. 注意事项

  - 多次调用  `next()` ：在生成器函数中，只有在生成器执行到  `return`  语句时，才会返回指定的值。之后再调用  `next()`  时， `done`  属性将始终为  `true` ，并且  `value`  将为  `undefined` 。
  - 异常处理：如果在生成器中抛出异常，可以使用  `throw()`  方法处理异常，并且可以在生成器中捕获这些异常。

  5. 总结
  生成器函数的返回值提供了一种机制，使得生成器可以在完成时返回一个特定的值。这个值可以用于指示生成器的最终状态或结果。通过理解生成器的返回值，我们可以更好地控制生成器的执行流程和结果处理。
  -->
</head>
<body>
  
  <script>
    // 生成器函数返回一个生成器对象
    function* foo(name) {
      console.log('111', name);
      yield 1;
      console.log('222', name);
      yield 2;
      console.log('333', name);
      yield 3;
      console.log('444', name);
    }

    const generator = foo("Generator");
    console.log(generator.next()); // 输出: { value: 1, done: false }
    console.log(generator.next()); // 输出: { value: 2, done: false }
    console.log(generator.next()); // 输出: { value: 3, done: false }
    console.log(generator.next()); // 输出: { value: undefined, done: true }

    console.log("=======================");

    function* foo2(name) {
      console.log('111', name);
      const name1 =  yield "yield-1";
      console.log('222', name, name1);
      const name2 =  yield "yield-2";
      // return "Generator-return"; // 生成器函数返回一个特定的值, 终止yield返回值
      console.log('333', name, name2);
      const name3 = yield "yield-3";
      console.log('444', name, name3);
      return "Generator";
    }

    const generator2 = foo2("Generator");
    console.log(generator2.next()); 
    console.log(generator2.next()); 
    console.log(generator2.next("next1")); 
    console.log(generator2.next("next2")); 
    console.log(generator2.next()); 


  </script>
  
</body>
</html>